# 导入所需库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import io
import base64
from flask import Flask, render_template

# 设置matplotlib支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

app = Flask(__name__)


def generate_plot(plot_func, *args, **kwargs):
    """
    生成图表并返回base64编码的图片数据
    """
    # 创建图形，减小尺寸以便更好地适应网格布局
    plt.figure(figsize=(8, 5))  # 从 (10, 6) 调整为 (8, 5)

    # 调用绘图函数
    plot_func(*args, **kwargs)

    # 将图像保存到内存中
    img = io.BytesIO()
    plt.savefig(img, format='png', bbox_inches='tight')
    img.seek(0)

    # 将图像转换为base64编码
    plot_url = base64.b64encode(img.getvalue()).decode()

    # 清除当前图形
    plt.close()

    return plot_url


def create_series_bar():
    """创建柱状图"""
    try:
        # 根据项目中的"柱状图.xlsx"生成一个Series
        # 需要安装 openpyxl 并准备Excel文件pip install openpyxl
        s = pd.read_excel('柱状图.xlsx', index_col=0)
    except (FileNotFoundError, ImportError):
        # 如果文件不存在或缺少依赖，则使用默认数据
        s = pd.Series([1, 3, 3, 4], index=list('ABCD'))
    s.plot(kind='bar', title='柱状图')
    plt.ylabel('数值')


def create_series_barh():
    """创建水平条形图"""
    s = pd.Series([1, 3, 3, 4], index=list('ABCD'))
    s.plot.barh(title='水平条形图')
    plt.xlabel('数值')


def create_pie_chart():
    """创建饼图"""
    s = pd.Series([1, 3, 3, 4], index=list('ABCD'))
    s.plot.pie(title='饼图', autopct='%1.1f%%')


def create_kde_density():
    """创建密度图"""
    s = pd.Series(np.random.randn(1000))
    s.plot.kde(title='密度图')
    plt.xlabel('值')
    plt.ylabel('密度')


def create_scatter():
    """创建散点图"""
    df = pd.DataFrame(np.random.randn(100, 2), columns=['X1', 'Y'])
    df.plot.scatter(x='X1', y='Y', title='散点图')


def create_box_plot():
    """创建箱型图"""
    df = pd.DataFrame(np.random.rand(10, 2), columns=['A', 'B'])
    df.plot.box(title='箱型图')
    plt.ylabel('数值')


def create_area_chart():
    """创建面积图"""
    df = pd.DataFrame(np.random.randint(10, size=(4, 4)),
                      columns=list('ABCD'),
                      index=list('WXYZ'))
    df.plot.area(title='面积图')
    plt.ylabel('数值')


@app.route('/')
def index():
    # 生成各种图表
    plots = {
        'bar': generate_plot(create_series_bar),
        'barh': generate_plot(create_series_barh),
        'pie': generate_plot(create_pie_chart),
        # 'kde': generate_plot(create_kde_density),
        'scatter': generate_plot(create_scatter),
        'box': generate_plot(create_box_plot),
        'area': generate_plot(create_area_chart)
    }

    return render_template('index.html', plots=plots)


@app.route('/index')
def index_page():
    return index()  # 复用原有的 index 函数


if __name__ == '__main__':
    app.run(debug=True, port=5003)
